/**
 * Order控制器模块
 */

const express = require("express");
const courseModule = require('./course');

const util = require("../common/util");
const crypto = require('crypto');
/**
 * @typedef {OrderDB}
 */
const OrderDB = require("../model/sqlite/order");

// 生成下单时间戳字符串
const timestamp = (new Date()).toISOString().replace(/T/, '-').replace(/\..+/, '');

// 生成一串随机字符串
const randomString = crypto.randomBytes(16).toString('hex');


/**
 * 新增订单
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function add(req, res) {
    (async function () {
        // let courseInfo = await courseModule.find(req.body.courseId);
        // if (!courseInfo) {
        // throw new Error('课程信息未找到');
        // }
        //FIXME:req.body的数据安全性校验
        let order = {
            userId: req.session.user.id,
            courseId: req.body.courseId,
            orderTotal: req.body.orderTotal, //订单价格为课程价格
            paymentMethod: req.body.paymentMethod,
            courseSource: req.body.courseSource,
            orderTime: Date.now(),
            transactionId: `${timestamp}-${randomString}`,
        };
        let db = OrderDB.getInstance();
        await db.connect();
        let result = await db.add(order);
        //await db.close();
        util.log(`新增订单信息：lastID->${result}`);
        res.json(util.FormatJSONData(201, `下单成功`, { lastID: result }));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取所有课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function findAll(req, res) {
    (async function () {
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        let sort = req.query.sort ? eq.query.sort : "desc";
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        let db = OrderDB.getInstance();
        await db.connect();
        let result = await db.findAll(orderBy, sort, limit, offset);
        //await db.close();
        util.logFormat("获取所有订单信息", result);
        res.json(
            util.FormatJSONData(200, "获取所有订单信息", result)
        );
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取指定用户ID的订单信息列表
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function findAllByUserId(req, res) {
    (async function () {
        //1.处理输入的数据
        //FIXME: 输入数据的正确性校验，一致性校验，完整性校验
        let userId = req.query.user_id ? req.query.user_id : -1;
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        let sort = req.query.sort ? eq.query.sort : "desc";
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        //2. 访问数据
        let db = OrderDB.getInstance();
        await db.connect();
        let result = await db.findAllByUserId(userId, orderBy, sort, limit, offset);
        //await db.close();

        //3.输出数据
        util.logFormat(`获取【limit=${limit}&offset=${offset}】订单信息%O`, result);
        res.json(util.FormatJSONData(200, `获取订单信息列表`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取指定课程ID的课程信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function find(req, res) {
    (async function () {
        let db = OrderDB.getInstance();
        await db.connect();
        let result = await db.find(req.params.id);
        //await db.close();
        util.logFormat(`获取【${req.params.id}】订单信息%O`, result);
        res.json(
            util.FormatJSONData(200, `获取订单信息【${req.params.id}】`, result)
        );
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取指定课程ID的订单信息列表
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function findAllByCourseId(req, res) {
    (async function () {
        //1.处理输入的数据
        //FIXME: 输入数据的正确性校验，一致性校验，完整性校验
        let courseId = req.query.course_id ? req.query.course_id : -1;
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        let sort = req.query.sort ? req.query.sort : "desc";
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        //2. 访问数据
        let db = OrderDB.getInstance();
        await db.connect();
        // 调用数据库方法获取数据
        let result = await db.findAllByCourseId(courseId, orderBy, sort, limit, offset);
        //await db.close();

        //3.输出数据
        util.logFormat(`获取【limit=${limit}&offset=${offset}】订单信息%O`, result);
        // 响应结果给客户端
        res.json(util.FormatJSONData(200, `获取订单信息列表`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 删除订单信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function remove(req, res) {
    (async function () {
        //FIXME:数据合法性校验
        let userId = req.params.id;
        let db = OrderDB.getInstance();
        await db.connect();
        let result = await db.remove(userId);
        //await db.close();
        util.log(`删除订单信息：changes->${result}`);
        res.json(util.FormatJSONData(204, `删除订单信息`, { changes: result }))
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取指定用户ID的订单总数
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function getCount(req, res) {
    (async function () {
        // 获取请求参数中的userId，如果不存在则默认为-1
        let userId = req.query.user_id ? req.query.user_id : -1;
        // 获取OrderDB的实例
        let db = OrderDB.getInstance();
        // 连接数据库
        await db.connect();
        // 调用数据库的getCount方法获取订单总数
        let result = await db.getCount(userId);
        //await db.close();
        util.log(`获取用户ID为【${userId}】的订单总数：${result}`);
        // 将结果以JSON格式返回给客户端
        res.json(util.FormatJSONData(200, `获取订单总数信息`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
 * 获取所有的订单总数
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function getCountAll(req, res) {
    (async function () {
        // 获取OrderDB的实例
        let db = OrderDB.getInstance();
        // 连接数据库
        await db.connect();
        // 调用数据库的getCount方法获取订单总数
        let result = await db.getCountAll();
        //await db.close();
        util.log(`获取所有的订单总数：${result}`);
        // 将结果以JSON格式返回给客户端
        res.json(util.FormatJSONData(200, `获取所有的订单总数信息`, result));
    })().catch(err => {
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}



module.exports = {
    add,
    find,
    findAll,
    findAllByUserId,
    findAllByCourseId,
    remove,
    getCount,
    getCountAll
};